package czt.alg;

import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;

import java.util.Collection;
import java.util.Optional;

/**
 * @author czt
 * @version 1.0
 * @since 2024/11/12
 *
 * 定义当sql中分片键使用=或者in时，走精确查询算法类，获取具体操作的数据源名称
 * 泛型为分片键的类型
 */
public class MyPreciseShardingAlgorithm implements PreciseShardingAlgorithm<Long> {

    /**
     *
     * @param collection 从配置的数据节点：ds${1..2}.t_order_${1..2}中获取数据源集合:ds1 ds2
     * @param preciseShardingValue 封装了逻辑表，分片列名称，条件值等
     * @return 返回要使用的数据源
     */
    @Override
    public String doSharding(Collection<String> collection, PreciseShardingValue<Long> preciseShardingValue) {
        //获取逻辑表名称t_order
        String logicTableName = preciseShardingValue.getLogicTableName();
        //获取数据指定的分片键名称user_id
        String columnName = preciseShardingValue.getColumnName();
        //获取值
        Long value = preciseShardingValue.getValue();
        //根据传入的值找对应的数据源
        Optional<String> result = collection.stream().filter(db -> db.endsWith((value % 2 + 1) + "")).findFirst();
        if (result.isPresent()) {
            return result.get();
        }
        return null;
    }
}
